/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.codeigniter.netbeans.completer;
import com.codeigniter.netbeans.shared.CentralManager;
import com.codeigniter.netbeans.shared.FileExtractor;
import com.codeigniter.netbeans.shared.PHPDocumentParser;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.swing.text.Document;
import javax.swing.text.JTextComponent;
import javax.swing.text.StyledDocument;
import org.netbeans.api.editor.completion.Completion;
import org.netbeans.api.editor.mimelookup.MimeRegistration;
import org.netbeans.api.lexer.Token;
import org.netbeans.api.lexer.TokenSequence;
import org.netbeans.modules.editor.NbEditorUtilities;
import org.netbeans.modules.php.editor.lexer.PHPTokenId;
import org.netbeans.spi.editor.completion.CompletionItem;
import org.netbeans.spi.editor.completion.CompletionProvider;
import org.netbeans.spi.editor.completion.CompletionResultSet;
import org.netbeans.spi.editor.completion.CompletionTask;
import org.netbeans.spi.editor.completion.support.AsyncCompletionQuery;
import org.netbeans.spi.editor.completion.support.AsyncCompletionTask;
import org.netbeans.spi.editor.completion.support.CompletionUtilities;
import org.openide.filesystems.FileObject;
import org.openide.util.Exceptions;
/**
*
* @author Tamaki_Sakura
*/
@MimeRegistration(mimeType = "text/x-php5", service = CompletionProvider.class)
public class CiCompleterView extends CiCompleterProviderBase {
@Override
public CompletionTask createTask(int i, JTextComponent jtc) {
if (i != CompletionProvider.COMPLETION_QUERY_TYPE) {
return null;
}
initCodeComplete(jtc);
AsyncCompletionQuery mViewCompletionQuery
= new CiViewAsyncCompletionQuery();
return new AsyncCompletionTask(mViewCompletionQuery, jtc);
}
@Override
public int getAutoQueryTypes(JTextComponent jtc, String string) {
return 0;
}
public static class CiViewAsyncCompletionQuery extends AsyncCompletionQuery {
@Override
protected void query(
CompletionResultSet completionSet,
Document doc, int offset) {
realQuery(completionSet, doc, offset);
completionSet.finish();
}
private void realQuery(
CompletionResultSet completionSet,
Document doc, int offset) {
TokenSequence<PHPTokenId> tokens = PHPDocumentParser.getTokenSequence(doc);
if (tokens == null) {
return;
}
tokens.move(offset);
tokens.moveNext();
Token<PHPTokenId> token = tokens.token();
if (token.id() != PHPTokenId.PHP_CONSTANT_ENCAPSED_STRING) {
return;
}
FileObject docObject = NbEditorUtilities.getFileObject(doc);
if (docObject == null) {
return;
}
FileObject parent = FileExtractor.getCiRoot(docObject);
if (parent == null) {
return;
}
int startOffset = tokens.offset() + 1;
int removeLength = token.length() - 2;
String basePath = parent.getFileObject(FileExtractor.VIEW_PATH).getPath();
List<String> phpExtention = new ArrayList<String>();
phpExtention.add("php");
try {
File base = new File(basePath);
List<File> viewFiles = FileExtractor.getFilesFromDirectory(
base, phpExtention, true);
for (File vf: viewFiles) {
CiViewCompletionItem vfci =
new CiViewCompletionItem(
base.toURI().relativize(vf.toURI()).getPath(),
startOffset, removeLength);
completionSet.addItem(vfci);
}
} catch (Exception ex) {
Exceptions.printStackTrace(ex);
}
}
}
public static class CiViewCompletionItem implements CompletionItem {
private String text;
private int startIndex;
private int removeLength;
public CiViewCompletionItem(String view, int start, int remove) {
text = view.substring(0, view.length() - 4);
startIndex = start;
removeLength = remove;
}
@Override
public void defaultAction(JTextComponent jtc) {
try {
final StyledDocument doc = (StyledDocument) jtc.getDocument();
// Replace existing text with complete frase.
doc.remove(startIndex, removeLength);
doc.insertString(startIndex, text, null);
jtc.setCaretPosition(startIndex + text.length());
} catch (Exception ex) {
Exceptions.printStackTrace(ex);
}
Completion.get().hideAll();
}
@Override
public void processKeyEvent(KeyEvent ke) {
}
@Override
public int getPreferredWidth(Graphics grphcs, Font font) {
return CompletionUtilities.getPreferredWidth(text, null, grphcs, font);
}
@Override
public void render(Graphics grphcs, Font font, Color color, Color color1, int i, int i1, boolean bln) {
CompletionUtilities.renderHtml(CentralManager.ICON,
text, null, grphcs, font, color, i, i1, bln);
}
@Override
public CompletionTask createDocumentationTask() {
return null;
}
@Override
public CompletionTask createToolTipTask() {
return null;
}
@Override
public boolean instantSubstitution(JTextComponent jtc) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public int getSortPriority() {
return 0;
}
@Override
public CharSequence getSortText() {
return text;
}
@Override
public CharSequence getInsertPrefix() {
return text;
}
}
}